/************************************************************
 * Project Name         [Thinking_In_Java]
 * File Name            [Example_02_Invoke_Methods.java]
 * Creation Date        [20-Jun-2014]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ************************************************************/
package pkg_04_reflection;

import java.lang.reflect.Method;

/**
 * 反射 - 方法指针
 * 
 * 2014-08-12 添加反射main方法的代码
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 * 
 */
public class Example_02_Invoke_Methods {

	/**
	 * 加法运算
	 * 
	 * @param param1
	 *            参数1
	 * @param param2
	 *            参数2
	 * @return 计算结果
	 */
	public int add(int param1, int param2) {
		return param1 + param2;
	}

	/**
	 * 得到回应的字符串
	 * 
	 * @param msg
	 *            要传入的字符串
	 * @return 回应的字符串
	 */
	public static String echo(String msg) {
		return "echo: " + msg;
	}

	/**
	 * 测试方法
	 * 
	 * @param args
	 *            命令行参数
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		Class<?> classType = Example_02_Invoke_Methods.class;

		// 构造调用对象
		Object invoker = classType.newInstance();
		// 获得调用的方法
		Method addMethod = classType.getMethod("add", new Class[] { int.class,
				int.class });
		// 获得调用结果
		Object result = addMethod.invoke(invoker, new Object[] { 33, 55 });
		System.out.println(result);

		Method echoMethod = classType.getMethod("echo",
				new Class[] { String.class });
		// 静态方法的调用者为null
		result = echoMethod.invoke(null, new Object[] { "Hello world" });
		System.out.println((String) result);

		// 反射main方法
		Class<?> anotherClassType = Example_01_Get_Class_Type.class;
		Method mainMethod = anotherClassType.getMethod("main", String[].class);
		result = mainMethod.invoke(null, new Object[] { new String[] {} });
	}

}
